/*
FATE
最近xhd正在玩一款叫做FATE的游戏，为了得到极品装备，xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感，但又不得不通过杀怪来升完这最后一级。现在的问题是，xhd升掉最后一级还需n的经验值，xhd还留有m的忍耐度，每杀一个怪xhd会得到相应的经验，并减掉相应的忍耐度。当忍耐度降到0或者0以下时，xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能升掉这最后一级吗？
Input
输入数据有多组，对于每组数据第一行输入n，m，k，s(0 < n,m,k,s < 100)四个正整数。分别表示还需的经验值，保留的忍耐度，怪的种数和最多的杀怪数。接下来输入k行数据。每行数据输入两个正整数a，b(0 < a,b < 20)；分别表示杀掉一只这种怪xhd会得到的经验值和会减掉的忍耐度。(每种怪都有无数个)
Output
输出升完这级还能保留的最大忍耐度，如果无法升完这级输出-1。
Sample Input
10 10 1 10
1 1
10 10 1 9
1 1
9 10 2 10
1 1
2 2
Sample Output
0
-1
1
状态转移方程：[j][k]=max(f[j][k],f[j-wei[i]][k-1]+val[i]); val[i]表示杀死第i个怪所得的经验值,wei[i]表示消耗的忍耐度
*/
#include <bits/stdc++.h>
#define ll long long
#define PI acos(-1)
#define M(n, m) memset(n, m, sizeof(n));
const int INF = 1e9 + 7;
const int maxn = 1e5 + 100;
using namespace std;

// val 经验；wei 忍耐度
int dp[111][111], val[111], wei[111];
/*
n 经验
m 忍耐度
num 怪的种数
s 最多杀怪数
*/
int n, m, k, s, num;

int main()
{
    while (~scanf("%d%d%d%d", &n, &m, &num, &s))
    {
        for (int i = 0; i < num; i ++)
            scanf("%d%d", &val[i], &wei[i]);
        int minn = INF;
        M(dp, 0)
        for (int i = 0; i < num; i ++)// 怪的种类
            for (int j = wei[i]; j <= m; j ++)// 消耗的忍耐度
                for (int k = 1; k <= s; k ++)// 杀怪的数量
                {
                    dp[j][k] = max(dp[j][k], dp[j - wei[i]][k - 1] + val[i]);
                    if (dp[j][k] >= n && j < minn)
                        minn = j;
                }
        if (minn != INF)
            printf("%d\n", m - minn);
        else
            printf("-1\n");
    }
    return 0;
}
